feat(ui): Settings screen matching Figma 17:2 (#64)#71
Conversation
Replace the SettingsPlaceholder stub with a sectioned Settings screen mirroring Figma node 17:2: M3 TopAppBar + back nav, seven labelled sections, M3 ListItem rows with chevron / Switch / Add / external-link / no trailing affordances. Pure stateless composable plus three local-only switches; no ViewModel, no persistence. OpenInNew icon is provided as a local vector drawable rather than pulling in material-icons-extended.
Code Review: #64Decision: PASS Findings
SummaryFaithful, minimal implementation of the spec. Visual fidelity against Figma 17:2 confirmed: section order, section-header color ( The two judgement calls flagged in the PR body are both reasonable:
Approving for documentation. |
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Summary
SettingsPlaceholderwithSettingsScreenatapp/src/main/java/de/pyryco/mobile/ui/settings/SettingsScreen.kt, mirroring Figma node 17:2 —TopAppBar+ back nav, vertically scrollableColumnover sevenlabel-largesection headers (Connection, Appearance, Defaults for new conversations, Notifications, Memory, Storage, About) with M3ListItemrows.KeyboardArrowRight), 18dp external-link icon (local vector drawable), M3Switch,+ Addpill (TextButton), or none — matching the AC table exactly. Three local-onlymutableStateOfswitches (Material You = on, YOLO = off, Push = on) animate during manual QA; no ViewModel, no persistence.composable(Routes.Settings)inMainActivity.ktto the new screen and removes the orphanedSettingsPlaceholder,Column, andTextButtonimports.Implementation notes
Icons.Default.OpenInNew, but that icon lives inmaterial-icons-extended, which isn't on the classpath (onlymaterial-icons-core). Per the "no new dependencies without justification" rule I added a small local vector drawable atres/drawable/ic_open_in_new.xmlinstead of pulling in the ~5 MB extended icon library for a single glyph.TextButton, notOutlinedButton. The Figma 17:81 frame has rounded-100 geometry but the rendered screenshot shows no visible border. The architect's spec called this out as developer's choice;TextButtonmatches the visual reference cleanly.@Previewcomposables (light + dark) atwidthDp = 412matching the rest of the codebase.Issue
Closes #64.
Testing
./gradlew assembleDebug— clean./gradlew test— clean (no new unit tests; the screen has no business logic per spec)./gradlew lint— 0 errors; 29 warnings all pre-existing (gradle versions, themeObsoleteSdkInt, etc.), none introduced by this change./gradlew connectedAndroidTest— not run (no device connected in this environment); no instrumented tests added per specArchitecture compliance
Follows the spec at
docs/specs/architecture/64-settings-screen-figma-17-2.mdverbatim except for the two implementation notes above (OpenInNew drawable substitution; TextButton for Add pill — explicit alternative permitted by the spec's open question). Public surface is the singleSettingsScreen(onBack, modifier)symbol; all helpers (SettingsSectionHeader,SettingsRow,ChevronIcon,ExternalLinkIcon,AddPill) are private. NoSettingsViewModel, no Koin module, no repository touched.🤖 Generated with Claude Code